package cc.kzc.adminauth.common;

public enum ErrorCode {

	/**
	 * 正确
	 */
	SUCCESS(0, "ok"),

	/**
	 * -1 系统通用错误
	 */
	ERR(-1, "failed"),

	// 40000 客户端请求错误
	/**
	 * 40000 客户端请求的语法错误，服务器无法理解
	 */
	CLI_PARAM_ERR(40000, "Bad Request"),

	/**
	 * 40001 缺少参数
	 */
	CLI_PARAM_MISSING(40001, "missing parameter"),

	/**
	 * 40002 参数值为空
	 */
	CLI_PARAM_VALUE_IS_NULL(40002, "param is null or empty value"),

	/**
	 * 40003 参数值格式错误
	 */
	CLI_PARAM_VALUE_FORMAT_ERR(40003, "param format error"),

	/**
	 * 40004 参数值范围错误
	 */
	CLI_PARAM_VALUE_RANGE_ERR(40004, "param value out of range"),

	/**
	 * 40005 请求内存数据类型错误
	 */
	CLI_CONTENT_TYPE_ERR(40005, "Content-Type is not present"),

	/**
	 * 40006 api不存在或者已经被废弃
	 */
	CLI_UNKONW_API(40006, "API not found or be removed"),

	// 40100 ******************************************************** //
	/**
	 * 40100 未经授权,请求要求用户的身份认证
	 */
	CLI_UNAUTHORIZED(40100, "Unauthorized"),

	// 40300 ******************************************************** //
	/**
	 * 40300 服务器理解请求客户端的请求，但是拒绝执行此请求
	 */
	CLI_FORBIDDEN(40300, "Forbidden"),

	// 40400 ******************************************************** //
	/**
	 * 40400 服务器无法根据客户端的请求找到资源
	 */
	CLI_NOT_FOUND(40400, "Not Found"),
	/**
	 * 40401 数据不存在
	 */
	CLI_DB_NOT_FOUND(40401, "data has not exist"),
	/**
	 * 40402 数据已经存在
	 */
	CLI_DB_EXISTED(40402, "data already existed"),

	/**
	 * 40500 服务器知道请求方法，但目标资源不支持该方法。
	 */
	CLI_API_NOT_ALLOWED(40500, "Method Not Allowed"),

	/**
	 * 40501 请求API被移除
	 */
	CLI_API_REMOVED(40501, "API be removed"),

	// 41000 系列
	/**
	 * 参数通用错误
	 */
	CLI_GONE(41000, "Gone"),

	/**
	 * 服务端拒绝该请求因为 Content-Length 头部字段未定义但是服务端需要它。
	 */
	CLI_LENGTH_REQUIRED(41100, "Length Required"),

	/**
	 * 客户端在其头文件中指出了服务器不满足的先决条件
	 */
	CLI_PRECONDITION_FAILED(41200, "Precondition Failed"),

	/**
	 * 请求实体大于服务器定义的限制。服务器可能会关闭连接，或在标头字段后返回重试 Retry-After。
	 */
	CLI_PAYLOAD_TOO_LARGE(41300, "Request Payload Too Large"),

	/**
	 * 请求的payload中数据格式错误
	 */
	CLI_PAYLOAD_FORMAT_ERROR(41301, "Payload Data Format Error"),

	/**
	 * 请求的payload为空
	 */
	CLI_PAYLOAD_BLANK(41302, "Payload is Blank"),

	/**
	 * 41303 文件上传错误
	 */
	CLI_UPLOAD_FILE_IS_EMPTY(41303, "upload file is empty"),

	/**
	 * 客户端请求的 URI 比服务器愿意接收的长度长。
	 */
	CLI_URI_TOO_LONG(41400, "URI Too Long"),

	/**
	 * 服务器不支持请求数据的媒体格式，因此服务器拒绝请求
	 */
	CLI_UNSUPPORTED_MEDIA_TYP(41500, "Unsupported Media Type"),

	/**
	 * 无法满足请求中 Range 标头字段指定的范围。该范围可能超出了目标 URI 数据的大小。
	 */
	CLI_RANGE_NOT_SATISFIABLE(41600, "Range Not Satisfiable"),

	/**
	 * 此响应代码表示服务器无法满足 Expect 请求标头字段所指示的期望。
	 */
	CLI_EXPECTATION_FAILED(41700, "Expectation Failed"),

	/**
	 * 请求被定向到无法生成响应的服务器。这可以由未配置为针对请求 URI 中包含的方案和权限组合生成响应的服务器发送。
	 */
	CLI_MISDIRECTED_REQUEST(42100, "Misdirected Request"),

	/**
	 * 请求格式正确，但由于语义错误而无法遵循。
	 */
	CLI_UNPROCESSABLE_ENTITY(42200, "Unprocessable Entity"),

	/**
	 * 正在访问的资源已锁定。
	 */
	CLI_DATA_LOCKED(42300, "Locked"),

	/**
	 * 由于前一个请求失败，请求失败。
	 */
	CLI_FAILED_DEPENDENCY(42400, "Failed Dependency"),

	/**
	 * 源服务器要求请求是有条件的。此响应旨在防止'丢失更新'问题，即当第三方修改服务器上的状态时，客户端 GET 获取资源的状态，对其进行修改并将其 PUT
	 * 放回服务器，从而导致冲突。
	 */
	CLI_PRECONDITION_REQUIRED(42800, "Precondition Required"),

	/**
	 * 用户在给定的时间内发送了太多请求（"限制请求速率"）
	 */
	CLI_TOO_MANY_REQUESTS(42900, "Too Many Requests"),

	/**
	 * 服务器不愿意处理请求，因为其头字段太大。在减小请求头字段的大小后，可以重新提交请求。
	 */
	CLI_REQUEST_HEADER_TOO_LARGE(43100, "Request Header Fields Too Large"),

	/**
	 * 用户代理请求了无法合法提供的资源，例如政府审查的网页。
	 */
	CLI_UNAVAILABLE_FOR_LEGAL_REASONS(45100, "Unavailable For Legal Reasons"),

	// 50000服务器错误
	/**
	 * 50000 服务器内部错误，无法完成请求
	 */
	SVR_ERR(50000, "Internal Server Error"),

	/**
	 * 50100 服务器不支持请求的功能，无法完成请求
	 */
	SVR_NOT_IMPLEMENTED(50100, "Not Implemented"),

	/**
	 * 50300 由于超载或系统维护，服务器暂时的无法处理客户端的请求
	 */
	SVR_SERVICE_UNAVAILABLE(50300, "Service Unavailable"),

	/**
	 * 服务器需要对请求进行进一步扩展才能完成请求。
	 */
	SVR_SYS_ERR(51000, "Not Extended"),

	/**
	 * 51001 服务器错误：服务端数据未找到
	 */
	SVR_SYS_DATA_NOT_FOUND(510001, "server data not found"),

	/**
	 * 51002 服务器错误：服务端端响应超时
	 */
	SVR_SYS_TIMEOUT(51002, "server process timeout"),
	/**
	 * 51100 压缩文件错误
	 */
	SVR_SYS_ZIP_ERROR(51100, "zip error"),
	/**
	 * 51101 解压文件错误
	 */
	SVR_SYS_UNZIP_ERROR(51101, "unzip error"),

	/**
	 * 服务器对接第三方错误
	 */
	SVR_SYS_THIRD_API_ERR(51200, "system use third api error"),

	/**
	 * 服务端数据错误
	 */
	SVR_DB_ERR(51300, "database server error"),

	/**
	 * 服务端文件错误
	 */
	SVR_FILE_ERR(51400, "file server error"),

	// 60000 以上为应用自定义

	// 60000--60999 为应用权限类相关

	// 61000 开始为业务错误

	// -- 以下为占位使用，请勿删除 --//
	/**
	 * -99999，代码占位
	 */
	NO_USED(-99999, "no used error");
	// -- 以上为占位使用，请勿删除 --//

	private final int code;

	private final String message;

	ErrorCode(int code, String message) {
		this.code = code;
		this.message = message;
	}

	public int code() {
		return this.code;
	}

	public String getMessage() {
		return this.message;
	}

	public static ErrorCode valueOf(int code) {
		ErrorCode errcode = resolve(code);
		if (errcode == null) {
			return ERR;
		}
		return errcode;
	}

	public static ErrorCode resolve(int code) {
		for (ErrorCode errcode : values()) {
			if (errcode.code == code) {
				return errcode;
			}
		}
		return null;
	}

}
